package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


/**
 * 定义服务消费端Controller,在这个Controller对象
 * 的方法中实现对远端服务sca-provider的调用
 */
@RestController
public class ConsumerController {
    /**
     * 读取application.yml配置文件中的spring.application.name值
     * 然后赋值给appName属性
     */
    @Value("${spring.application.name}")
    private String appName;
    /**
     * 从spring容器获取一个RestTemplate对象,
     * 基于此对象实现远端服务调用
     */
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
        //1.定义要调用的远端服务的url
        String url="http://localhost:8081/provider/echo/"+appName;
        //2.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }

    /**
     * 目标:在doRestEcho01的基础之上实现负载均衡?
     * 如何:LoadBalancerClient
     */
    //LoadBalancerClient对象负责从nacos服务中发现和获取服务实例
    @Autowired
    private LoadBalancerClient loadBalancerClient;//RibbonLoadBalancerClient
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02(){
        //1.获取provider服务实例
        ServiceInstance serviceInstance =
                //sca-provider 为nacos服务列表中的服务名
                loadBalancerClient.choose("sca-provider");
        String host=serviceInstance.getHost();
        int port=serviceInstance.getPort();
        //2.定义要调用的远端服务的url
        //String url="http://"+host+":"+port+"/provider/echo/"+appName;
        String url = String.format("http://%s:%s/provider/echo/%s",
                host,port,appName);
        //3.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }

    /*目标:在doRestEcho03方法中对doRestEcho02代码实现简化操作
     *简化:简化基于loadBalancerClient获取服务实例信息的过程
     *如何简化的?
     *底层为RestTemplate对象注入拦截器,在底层拦截器中实现服务实例的获取.
     *如何为RestTemplate对象注入拦截器?
     *RestTemplate对象构建时使用@LoadBalanced注解进行描述
     */
    @Autowired
    private RestTemplate loadBalancedRestTemplate;

    @GetMapping("/consumer/doRestEcho3")
    public String doRestEcho03(){
        String serviceId="sca-provider";//nacos服务列表中的一个服务名
        //String url="http://"+serviceId+"/provider/echo/"+appName;
        String url=String.format("http://%s/provider/echo/%s",serviceId,appName);
        return loadBalancedRestTemplate.getForObject(url,String.class);
    }


}//browser->sca-consumer-->sca-provider
